/** 
 * Copyright(C) 2010-2011 <webPrj> LTD. All Rights Reserved.                               
 * Project: webPrj
 * Module ID: <0001>
 * Comments: TODO         
 * JDK version used: <JDK1.6.0_25>                              
 * Author: xiamingxing
 * Create Date：10:26:15
 * Modified By: xiamingxing                              
 * Modified Date: 10:26:15                                  
 * Why & What is modified: <修改原因描述>    
 * Version: V1.0                  
 */
package com.xiamx.platform.core.dao;

import java.io.Serializable;
import java.util.List;

import org.springframework.orm.ibatis.SqlMapClientTemplate;

import com.xiamx.platform.exception.AppException;

public interface IBaseDao<T, PK extends Serializable> {

	/**
	 * 
	 * @description 插入一个实体（在数据库INSERT一条记录）  
	 * @author xiamingxing
	 * @param statementName
	 * @param entity
	 */
    public abstract void insert(String statementName, T entity) throws Exception;
    
    /**
     * 
     * @description 修改一个实体对象（UPDATE一条记录）  
     * @author xiamingxing
     * @param statementName
     * @param entity
     * @return
     */
    public abstract int update(String statementName, T entity) throws Exception;   

    /**
     * 
     * @description 根据传入的参数实体，删除对象
	 * <p><strong>此方法一定要慎用，如果条件设置不当，可能会删除有用的记录！</strong></p>
     * @author xiamingxing
     * @param statementName
     * @param entity
     * @return
     */
	public abstract int delete(String statementName, T entity) throws Exception;
	
	/**
	 * 
	 * @description 按主键删除记录  
	 * @author xiamingxing
	 * @param statementName
	 * @param primaryKey 主键对象  
	 * @return 删除的对象个数，正常情况=1 
	 */
    public abstract int delete(String statementName, PK primaryKey) throws Exception;
    
    /**
     * 
     * @description 删除符合条件的记录  
     * <p><strong>此方法一定要慎用，如果条件设置不当，可能会删除有用的记录！</strong></p> 
     * @author xiamingxing
     * @param statementName
     * @return
     */
    public abstract int delete(String statementName) throws Exception;  
    
    /**
     * 
     * @description 按主键逻辑删除记录  
     * @author xiamingxing
     * @param primaryKey 主键对象  
     * @return 逻辑删除的对象个数，正常情况=1  
     */
    public abstract int logicDelete(String statementName,PK primaryKey) throws Exception; 
    
    /**
     * 
     * @description 逻辑删除符合条件的记录  
     * <p><strong>此方法一定要慎用，如果条件设置不当，可能会逻辑删除有用的记录！</strong></p>  
     * @author xiamingxing
     * @param statementName
     * @param param
     * @return
     */
    public abstract int logicDelete(String statementName, T param) throws Exception; 
    
    /**
     * 
     * @description 清空表，比delete具有更高的效率，而且是从数据库中物理删除（delete是逻辑删除，被删除的记录依然占有空间）  
     * @author xiamingxing
     * @param statementName
     * @return
     */
    public abstract int truncate(String statementName) throws Exception; 
      
    /**
     * 
     * @description 查询整表总记录数  
     * @author xiamingxing
     * @param statementName
     * @return
     */
    public abstract Integer count(String statementName) throws Exception;   
       
    /**
     * 
     * @description 查询符合条件的记录数  
     * @author xiamingxing
     * @param statementName
     * @param param
     * @return
     */
    public abstract Integer count(String statementName, T param) throws Exception;
    
    /**
     * 
     * @description 按主键取记录  
     * @author xiamingxing
     * @param statementName
     * @param t
     * @return 记录实体对象，如果没有符合主键条件的记录，则返回null
     * @throws Exception 
     */
    public abstract T get(String statementName, T t) throws Exception;   
  
    /**
     * 
     * @description 按主键取记录  
     * @author xiamingxing
     * @param statementName
     * @param primaryKey
     * @return
     * @throws AppException
     */
    public abstract T load(String statementName, PK primaryKey) throws Exception;   
  
    /**
     * 
     * @description 取全部记录  
     * @author xiamingxing
     * @param statementName
     * @return 全部记录实体对象的List  
     * @throws
     */
    public abstract List<T> select(String statementName) throws Exception;   
       
    /**
     * 
     * @description 按条件查询记录  
     * @author xiamingxing
     * @param statementName
     * @param param
     * @return
     * @throws
     */
    public abstract List<T> select(String statementName, T param) throws Exception;
    
    /**
     * 
     * @description TODO
     * @author xiamingxing
     * @param statementName
     * @param param
     * @param rowStart
     * @param pageSize
     * @return
     * @throws
     */
    public abstract List<T> select(String statementName, T param,int rowStart, int pageSize) throws Exception; 
    
    
    /**************************分页操作***********************************************/
    
    /**  
     * 按条件查询记录，并处理成分页结果  
     * @param param 查询条件参数，包括WHERE条件、分页条件、排序条件  
     * @return PaginationResult对象，包括（符合条件的）总记录数、页实体对象List等  
     */  
    //public abstract PaginationResult<T> selectPagination(String statementName, T param);   
       
    /**  
     * 按条件查询记录，并把有外键关联的字段的关联对象也处理出来，并处理成分页结果  
     * <p>此方法是为了避免1+N而设置的</p>  
     * @param param 查询条件参数，包括WHERE条件、分页条件、排序条件<strong>（不包括外键关联表条件）</strong>  
     * @return PaginationResult对象，包括（符合条件的）总记录数、页实体对象List等  
     */ 
    
    //public abstract PaginationResult<T> selectFkPagination(String statementName, T param);   
 
    
    /******************************批量操作方法 *****************************************/
    
    /**
     * 
     * @description 批量插入  
     * @author xiamingxing
     * @param statementName
     * @param list
     */
    public abstract void batchInsert(String statementName, final List<T> list) throws Exception;   
       
    /**  
     * 批量修改  
     * @param list  
     */  
    /**
     * 
     * @description TODO
     * @author xiamingxing
     * @param statementName
     * @param list
     */
    public abstract void batchUpdate(String statementName, final List<T> list) throws Exception;   
       
    /**
     * 
     * @description 批量删除  
     * @author xiamingxing
     * @param statementName
     * @param list
     */
    public abstract void batchDelete(String statementName, final List<PK> list) throws Exception; 
    
    /**
     * 
     * @description 批量逻辑删除  
     * @author xiamingxing
     * @param statementName
     * @param list
     */
    public abstract void batchLogicDelete(String statementName, final List<PK> list) throws Exception;

    /**
     * 
     * @description 获取SqlMapClientTemplate  
     * @author xiamingxing
     * @return
     */
    public SqlMapClientTemplate getSqlMapClientTemplate() throws Exception;
    
}

